﻿using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MathService.Forms
{
    public partial class ProgressForm : Form
    {
        //активация окна
        private const int SW_ACTIVATE = 10;
        private const string User32dll = "user32.dll";
        //вынести поверх всех обычных окон и поверх всех TOP
        private const int HWND_TOPMOST = -1;

        [DllImport(User32dll)]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport(User32dll, EntryPoint = "SetWindowPos")]
        private static extern bool SetWindowPos(
                                                IntPtr hWnd,           // хэндл окна
                                                int hWndInsertAfter,   // z-порядок
                                                int X,                 // позиция по горизонтали
                                                int Y,                 // позиция по вертикали
                                                int cx,                // ширина
                                                int cy,                // высота
                                                uint uFlags);          // флаг позиции windows

        /* ------------------------------------------------------------------------------------------ */

        //код тень
        private const int CS_DROPSHADOW = 0x00020000;

        protected override CreateParams CreateParams
        {
            get
            {
                //получаем версию операционной системы
                var lv_OSVer = Environment.OSVersion.Version;
                //Проверяем ОС перед использованием
                var lv_Params = base.CreateParams;

                //проверяем версия операционной системы
                if(lv_OSVer.Major == 5)
                {
                    if(lv_OSVer.Minor > 0 && (OSFeature.IsPresent(SystemParameter.DropShadow))) //Определяем, поддерживает ли 2000 показ теней
                        lv_Params.ClassStyle |= CS_DROPSHADOW; //добавляем к стилю тень
                }
                else if(lv_OSVer.Major >= 5 && OSFeature.IsPresent(SystemParameter.DropShadow))
                    lv_Params.ClassStyle |= CS_DROPSHADOW;
                return lv_Params;
            }
        }

        /* ------------------------------------------------------------------------------------------ */

        public string Label { get { return f_Label.Text; } set { SetLabelText(value); } }

        public int Progress { get { return f_ProgressBar.Value; } set { SetProgress(value); } }

        public int MinProgress { get { return f_ProgressBar.Minimum; } set { SetMinProgress(value); } }
        public int MaxProgress { get { return f_ProgressBar.Maximum; } set { SetMaxProgress(value); } }

        /* ------------------------------------------------------------------------------------------ */

        public ProgressForm()
        {
            InitializeComponent();

            //определяем позицию окна, чтобы оно отображалось в центре экрана
            var winLeft = SystemInformation.PrimaryMonitorSize.Width / 2 - Width / 2;
            var winTop = SystemInformation.PrimaryMonitorSize.Height / 2 - Height / 2;

            SetWindowPos(Handle, HWND_TOPMOST, winLeft, winTop, Width, Height, SW_ACTIVATE); //устанавливаем позицию по полученным значениям
            Left = winLeft;
            Top = winTop;

            ShowWindow(Handle, SW_ACTIVATE); //показываем окно
        }

        /* ------------------------------------------------------------------------------------------ */

        private void SetLabelText(string text)
        {
            if(InvokeRequired)
                Invoke((Action<string>)SetLabelText, text);
            else
                f_Label.Text = text;
        }

        private void SetProgress(int value)
        {
            if(InvokeRequired)
                Invoke((Action<int>)SetProgress, value);
            else
                f_ProgressBar.Value = value;
        }

        private void SetMinProgress(int value)
        {
            if(InvokeRequired)
                Invoke((Action<int>)SetMinProgress, value);
            else
                f_ProgressBar.Minimum = value;
        }

        private void SetMaxProgress(int value)
        {
            if(InvokeRequired)
                Invoke((Action<int>)SetMaxProgress, value);
            else
                f_ProgressBar.Maximum = value;
        }

        /* ------------------------------------------------------------------------------------------ */
    }
}
